// 进程管理.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
//#include "conio.h"
#include "stdio.h"
#include "stdlib.h"
void clrscr();
void create();
void run();
void moveout();
void kill();
void wakeup();

struct process_type
{
    int pid;
    int priority;
    int size;
    int state; // 0: 不存在, 1: 运行, 2: 阻塞
    char info[10];
};

struct process_type memory[20]; // 模拟内存中的进程
struct process_type block_memory[20]; // 模拟外存中的阻塞进程
int number = 0, block = 0, pid, flag = 0;

int main()
{
    int n;
    char a;
    n = 1;
    clrscr();
    while (n == 1)
    {
        printf("\n********************************************");
        printf("\n*               进程演示系统              *");
        printf("\n********************************************");
        printf("\n     1.创建新的进程     2.查看运行进程    ");
        printf("\n     3.换出某个进程     4.杀死运行进程    ");
        printf("\n     5.唤醒某个进程     6.退出系统        ");
        printf("\n********************************************");
        printf("\n请选择（～）");
        a = getchar();
        switch (a)
        {
        case '1':
            create();
            break;
        case '2':
            run();
            break;
        case '3':
            moveout();
            break;
        case '4':
            kill();
            break;
        case '5':
            wakeup();
            break;
        case '6':
            exit(0);
        default:
            n = 0;
        }
    }
}

void create() /* 创建一个进程的示例*/
{
    int i = 0;
    if (number >= 20)
    {
        printf("\n内存已满，请先结束或换出进程\n");
    }
    else
    {
        for (i = 0; i < 20; i++)
        {
            if (memory[i].state == 0)
                break;
        }
        printf("\n请输入新进程的pid\n");
        scanf("%d", &memory[i].pid);
        getchar(); // 消耗掉多余的换行符
        
        printf("\n请输入新进程的优先级\n");
        scanf("%d", &memory[i].priority);
        getchar(); // 消耗掉多余的换行符
        
        printf("\n请输入新进程的大小\n");
        scanf("%d", &memory[i].size);
        getchar(); // 消耗掉多余的换行符
        
        printf("\n请输入新进程的内容\n");
        scanf("%s", memory[i].info);
        getchar(); // 消耗掉多余的换行符
        
        memory[i].state = 1;
        number++;
    }
}


void clrscr() /*清除内存空间*/
{
    int i;
    for (i = 0; i < 20; i++)
    {
        memory[i].pid = 0;
        memory[i].priority = 0;
        memory[i].size = 0;
        memory[i].state = 0;
    }
    number = 0;
}

void run() /* 查看内存中进程运行的情况 */
{
    printf("\n当前内存中的进程：\n");
    for (int i = 0; i < 20; i++)
    {
        if (memory[i].state == 1)
        {
            printf("进程ID: %d, 优先级: %d, 大小: %d, 内容: %s\n", memory[i].pid, memory[i].priority, memory[i].size, memory[i].info);
        }
    }
}

void moveout() /* 换出进程 */
{
    if (number == 0)
    {
        printf("当前没有运行进程\n");
        return;
    }
    printf("\n输入换出进程的ID值: ");
    scanf("%d", &pid);
    flag = 0;
    for (int i = 0; i < 20; i++)
    {
        if (memory[i].state == 1 && memory[i].pid == pid)
        {
            block_memory[block] = memory[i];
            block++;
            memory[i].state = 0;
            number--;
            flag = 1;
            printf("进程%d已换出\n", pid);
            break;
        }
    }
    if (!flag)
    {
        printf("要换出的进程不存在\n");
    }
}

void kill() /* 杀死某个进程 */
{
    if (number == 0)
    {
        printf("当前没有运行进程\n");
        return;
    }
    printf("\n请输入要杀死的进程ID: ");
    scanf("%d", &pid);
    flag = 0;
    for (int i = 0; i < 20; i++)
    {
        if (memory[i].state == 1 && memory[i].pid == pid)
        {
            memory[i].state = 0;
            number--;
            flag = 1;
            printf("进程%d已杀死\n", pid);
            break;
        }
    }
    if (!flag)
    {
        printf("要杀死的进程不存在\n");
    }
}

void wakeup() /* 唤醒某个进程 */
{
    if (block == 0)
    {
        printf("当前没有挂起进程\n");
        return;
    }
    printf("\n输入要唤醒的进程ID: ");
    scanf("%d", &pid);
    flag = 0;
    for (int i = 0; i < 20; i++)
    {
        if (block_memory[i].state == 2 && block_memory[i].pid == pid)
        {
            for (int j = 0; j < 20; j++)
            {
                if (memory[j].state == 0)
                {
                    memory[j] = block_memory[i];
                    memory[j].state = 1;
                    number++;
                    block_memory[i].state = 0;
                    block--;
                    flag = 1;
                    printf("进程%d已唤醒\n", pid);
                    break;
                }
            }
            break;
        }
    }
    if (!flag)
    {
        printf("要唤醒的进程不存在\n");
    }
}